/*
 * Contenitore per in metodi necessari alla sottosrizione di un nuvo feed RSS  
 */
var CheckRSSUrl = 
{
	/*
	 *  Controlla che l'url inserita come parametro sia valida e fa una richiesta asincrona per ottenere
	 * il contenuto della pagina specificate, indipendentemente che sia una pagina web o un file 
	 * xml di feed
	 */
    check : function (url) 
    {
        if (url.trim().indexOf("http://") > - 1) {
            url = url.substring(7);
        }
        var funArr = [];
        funArr.push(new Function("CheckRSSUrl.reportError('The URL you specified does not exist or is unreachable!')"));
        funArr.push(new Function("CheckRSSUrl.partialLoad();"));
        var reqUrl = "../cgi-bin/feedretrieve.pl?url=http://" + url;
        Ajax.makeRequest(reqUrl, "text/html", CheckRSSUrl.parseUrlHeader, funArr);
        return false;
    },
    /*
     * Mostra a schermo nel momento del caricamento asincrono un'immagine e una scritta 
     * 'per far capire all'utente che il feed si sta caricando' 
     */
    partialLoad : function () 
    {
        var f = document.getElementById("subs_form").getElementsByTagName("fieldset")[0];
        
	        if (document.getElementById("error") != null) {
	            f.removeChild(document.getElementById("error"));
	        }
	        if (document.getElementById("loading") != null) {
	            f.removeChild(document.getElementById("loading"));
	        }
	        var par = document.createElement("p");
	        par.id = "loading";
	        var loadImg = document.createElement("img");
	        loadImg.src = "../images/ajax-loader.gif";
	        loadImg.setAttribute("alt", " ");
	        par.appendChild(loadImg);
	        par.appendChild(document.createTextNode(" Loading..."));
	        f.appendChild(par);
        
    },
    /*
    * Parser per l'head del documento caricato dinamicamente
    * Serve a tirare fuori tutte le possibili sottoscrizioni di un URL
    */
    parseUrlHeader : function (sHtml) 
    {
        //alert(sHtml);
        var xmlDom = Ajax.createDocument();
        var pageTitle = "";
        var RSSLinks = [];
        var RSSTitles = [];
        var error = null;
        var theRoot = null;
        // per prima cosa controllo se è un link diretto ad un feed RSS
        try 
        {
            //alert("try DOMParser");
            var p = new DOMParser();
            xmlDom = p.parseFromString(sHtml, "text/xml");
            theRoot = xmlDom.documentElement;
            //alert(theRoot.tagName);
            if (theRoot.tagName.trim() != "parsererror") 
            {
                if (theRoot.tagName == "rss" || theRoot.tagName == "feed") 
                {
                    CheckRSSUrl.parseRSS(theRoot, document.getElementById("http_input").value);
                    return true;
                }
            }
        }
        catch (e) 
        {
            xmlDom.loadXML(sHtml);
            //alert(xmlDom);
            theRoot = xmlDom.documentElement;
            //alert(xmlDom.parseError.reason + " " + theRoot);
            if (xmlDom.parseError.errorCode == 0) 
            {
                if (theRoot.tagName == "rss" || theRoot.tagName == "feed") 
                {
                    CheckRSSUrl.parseRSS(theRoot, document.getElementById("http_input").value);
                    return true;
                }
            }
        }
        //alert(sHtml);
        // Non posso analizzare la stringa come se fosse un XML perchè la maggior parte delle pagine
        // non sono well formed. Di conseguenza la tratto come una normale stringa e ne estraggo l'head
        var indexOfHead = sHtml.indexOf("<head");
        if (!(indexOfHead > - 1)) 
        {
            CheckRSSUrl.reportError("This URL you specified can't be processed. Try to get direct access to RSS feed in that page and paste it's URL above");
            return false;
        }
        var head = sHtml.substring(indexOfHead, sHtml.indexOf("</head>", indexOfHead)) + "</head>";
        // la maggior parte dei siti non è strict. lavoro sulle stringhe
        // rimuovo elementi inutili per rendere il parsing più facile
        //alert(head);
        //
        // RIMOZIONE DEGLI SCRIPT DALL'HEAD
        //
        var scr_flag = (head.indexOf("<script") > - 1) ? true : false;
        while (scr_flag) 
        {
            var script_init = head.indexOf("<script");
            var scriptBody = head.substring(script_init, head.indexOf("</script>", script_init)) + "</script>";
            var parts = head.split(scriptBody);
            //alert(scriptBody);
            head = parts.join(" ");
            //alert(head);
            scr_flag = (head.indexOf("<script") > - 1) ? true : false;
        }
        //
        // RIMOZIONE DEGLI STYLE DALL'HEAD
        //
        scr_flag = (head.indexOf("<style") > - 1) ? true : false;
        while (scr_flag) 
        {
            var style_init = head.indexOf("<style");
            var styleBody = head.substring(style_init, head.indexOf("</style>", style_init)) + "</style>";
            var parts = head.split(styleBody);
            //alert(styleBody);
            head = parts.join(" ");
            //alert(head);
            scr_flag = (head.indexOf("<style") > - 1) ? true : false;
        }
        //
        // RIMOZIONE DEI METATAG
        //
        scr_flag = (head.indexOf("<meta") > - 1) ? true : false;
        while (scr_flag) 
        {
            var meta_init = head.indexOf("<meta");
            var metaBody = head.substring(meta_init, head.indexOf(">", meta_init)) + ">";
            var parts = head.split(metaBody);
            //alert(scriptBody);
            head = parts.join(" ");
            //alert(head);
            scr_flag = (head.indexOf("<meta") > - 1) ? true : false;
        }
        //
        // RECUPERO DEL TIOLO DELLA PAGINA
        //
        var title_init = head.indexOf("<title");
        var title_body = head.substring(title_init, head.indexOf("</title>", title_init)) + "</title>";
        //alert(title_body);
        try 
        {
            var p = new DOMParser();
            xmlDom = p.parseFromString(title_body, "text/xml");
            pageTitle = Ajax.getText(xmlDom.documentElement);
        }
        catch (e) {
            xmlDom.loadXML(title_body);
            pageTitle = Ajax.getText(xmlDom.documentElement);
        }
        //
        // RECUPERO DEI LINK 
        //
        scr_flag = (head.indexOf("<link") > - 1) ? true : false;
        while (scr_flag) 
        {
            var link_init = head.indexOf("<link");
            var linkBody = head.substring(link_init, head.indexOf(">", link_init)) + ">";
            var parts = head.split(linkBody);
            if (linkBody.charAt(linkBody.length - 2) != "/") {
                linkBody += "</link>";
            }
            //alert(linkBody);
            var element = null;
            try 
            {
                var p = new DOMParser();
                xmlDom = p.parseFromString(linkBody, "text/xml");
                element = xmlDom.documentElement;
            }
            catch (e) {
                xmlDom.loadXML(linkBody);
                element = xmlDom.documentElement;
            }
            if (element != null) 
            {
                if (element.getAttribute("type") == "application/rss+xml" || element.getAttribute("type") == "application/atom" || element.getAttribute("type") == "application/rss") 
                {
                    RSSLinks.push(element.getAttribute("href"));
                    var tit = element.getAttribute("title");
                    if (tit != null) {
                        RSSTitles.push(element.getAttribute("title"));
                    }
                    else {
                        RSSTitles.push("Title not specified");
                    }
                }
            }
            head = parts.join(" ");
            scr_flag = (head.indexOf("<link") > - 1) ? true : false;
        }
        CheckRSSUrl.displayData(pageTitle, RSSTitles, RSSLinks);
    },
    /*
    * Mostra a schermo i risultati del parsing effettuato con parseUrlHead
    */
    displayData : function (pageTitle, RSSTitles, RSSLinks) 
    {
    	document.getElementById("subs_form").setAttribute("action", "../cgi-bin/feedscribe.pl");
    
        if (RSSTitles.length == 0) 
        {
            CheckRSSUrl.reportError("There are no available feeds in the page you specified!");
            return false;
        }
        var fieldset = document.getElementById("RSSCheckButton").parentNode;
        if (document.getElementById("loading") != null) {
            fieldset.removeChild(document.getElementById("loading"));
        }
        if (document.getElementById("error") != null) {
            fieldset.removeChild(document.getElementById("error"));
        }
        document.getElementById("RSSCheckButton").removeAttribute("onclick");
        fieldset.removeChild(document.getElementById("RSSCheckButton"));
        var des_par = document.createElement("p");
        des_par.id = "des_par";
        var des_span = document.createElement("span");
        des_span.appendChild(document.createTextNode("You checked for: "));
        des_par.appendChild(des_span);
        des_par.appendChild(document.createTextNode(pageTitle));
        var label = document.createElement("label");
        label.id = "feeds_label";
        label.setAttribute("for", "available_feeds");
        label.appendChild(document.createTextNode("Available feeds: "));
        var sel = document.createElement("select");
        //sel.name = "choice";
        sel.id = "available_feeds";
        sel.name = "link";
        for (var i = 0; i < RSSLinks.length; i++) 
        {
            var opt = document.createElement("option");
            if(RSSLinks[i].indexOf("http://") > -1) {
            	opt.value = RSSLinks[i];
            }
            else {
            	opt.value = "http://" + document.getElementById("http_input").value + RSSLinks[i];
            }
            opt.appendChild(document.createTextNode(RSSTitles[i]));
            sel.appendChild(opt);
        }
        //document.getElementById("subs_form").setAttribute("action", "subs.pl");
        var subButton = document.createElement("input");
        subButton.setAttribute("type", "submit");
        var funBody = "var sel = document.getElementById('available_feeds'); var n = document.getElementById('feed_name').value; CheckRSSUrl.subscribe(n, sel.options[sel.selectedIndex].value);";
        var fun = new Function("ev", funBody);
        if(document.getElementById("tab_index")) {
        	
        }
        else {
	        subButton.onclick = function () 
	        {
	            fun();
	            return false;
	        }
        }
        subButton.setAttribute("value", "Subscribe!");
        subButton.id = "sub_button";
        var l = document.createElement("label");
        l.setAttribute("for", "feed_name");
        l.appendChild(document.createTextNode("Insert a name for your feed : "));
        var na = document.createElement("input");
        na.id = "feed_name";
        na.name = "feed_name";
        fieldset.appendChild(des_par);
        fieldset.appendChild(label);
        fieldset.appendChild(sel);
        fieldset.appendChild(document.createElement("br"));
        fieldset.appendChild(l);
        fieldset.appendChild(na);
        fieldset.appendChild(document.createElement("br"));
        fieldset.appendChild(subButton);
    },
    /*
    * Riporta a schermo una stringa di errore durante l'esecuzione
    */
    reportError : function (errorString) 
    {
        var fieldset = document.getElementById("subs_form").getElementsByTagName("fieldset")[0];
        if (document.getElementById("error") != null) {
            fieldset.removeChild(document.getElementById("error"));
        }
        if (document.getElementById("loading") != null) {
            fieldset.removeChild(document.getElementById("loading"));
        }
        var ErrPar = document.createElement("p");
        ErrPar.className = "error";
        ErrPar.id = "error";
        var ErrTxt = document.createTextNode(errorString);
        ErrPar.appendChild(ErrTxt);
        //fieldset.appendChild(document.createElement("br"));
        fieldset.appendChild(ErrPar);
    },
    /*
    * Ottiene titolo e versione da un link RSS diretto
    */
    parseRSS : function (theRoot, url) 
    {
        var version = "";
        var links = [];
        var titles = [];
        links.push(url);
        if (theRoot.tagName == "rss") 
        {
            version = theRoot.getAttribute("version");
            var ch = theRoot.getElementsByTagName("channel")[0];
            titles.push(Ajax.getText(ch.getElementsByTagName("title")[0]) + " RSS " + version);
        }
        if (theRoot.tagName == "feed") 
        {
            version = theRoot.getAttribute("version");
            titles.push(Ajax.getText(theRoot.getElementsByTagName("title")[0]));
        }
        CheckRSSUrl.displayData(titles[0], titles, links);
    },
    /*
     * Manda la richiesta di sottoscrizoine ad un nuovo feed. Fa una richiesta asincrona 
     *  per uno script in perl adatto al compito (subscribe.pl)
     */
    subscribe : function (name, url) 
    {
    	alert("trying...");
    	var sel = document.getElementById('available_feeds');
    	var title = sel.options[sel.selectedIndex].text;
    	var theID = document.getElementById("id").value;
        var funArr = [];
        funArr.push(new Function("CheckRSSUrl.reportError('Error while registering your subscription. Please try again.')"));
        funArr.push(new Function("CheckRSSUrl.partialLoad();"));
        var reqUrl = "../cgi-bin/feedscribe.pl";
        alert("url");
        var postData = 'id=' + theID + '&feed_name=' + name + '&link=' + url;
        Ajax.makeRequest(reqUrl, "text/plain", alert, funArr, postData);
    }
}
